#ifndef __SESSION_MANAGER_H__
#define __SESSION_MANAGER_H__
#include <mysql/mysql.h>

#include "../timeoutManager/ringQueue/hashSet/hashMap/hashMap.h"
#include "../log/systemLog/systemLog.h"
#include "../directory/folderStack.h"

// 用户会话
typedef struct user_session_s
{
    int user_id;        // 用户ID
    char username[256]; // 用户名
    int netfd;          // 用户网络文件描述符
    MYSQL *conn;        // 数据库连接指针
    enum
    {
        CONN_STATE_INITIAL,           // 初始状态，等待第一个数据包
        CONN_STATE_AWAITING_LOGIN,    // 等待登录（接收用户名）
        CONN_STATE_AWAITING_PASSWORD, // 发送了盐值，等待密文密码
        CONN_STATE_AUTHENTICATED      // 已认证，处理短命令
    } state;                          // 连接状态
    folderStack_t *pStack;            // 目录栈
    char path[1024];                  // 路径
} user_session_t;

// 会话管理器
typedef struct session_manager_s
{
    hash_map_t fd_map;       // fd -> user_session_t*
    hash_map_t username_map; // username -> user_session_t*
} session_manager_t;

extern session_manager_t g_session_manager;

/**
 * @brief 初始化会话管理器
 *
 * @param manager 需要初始化的会话管理器指针
 * @param size 哈希表大小
 * @return system_error_code_t 初始化结果状态码
 */
system_error_code_t session_manager_init(session_manager_t *manager, int size);

/**
 * @brief 添加一个新的会话到管理器
 *
 * @param manager 会话管理器指针
 * @param fd 新连接的文件描述符
 * @return system_error_code_t 操作结果状态码
 */
system_error_code_t session_manager_add_session(session_manager_t *manager, int fd);

/**
 * @brief 根据文件描述符获取会话
 *
 * @param manager 会话管理器指针
 * @param fd 文件描述符
 * @param out_session 输出参数，用于接收会话指针的地址
 * @return system_error_code_t 操作结果状态码
 */
system_error_code_t session_manager_get_session(session_manager_t *manager, int fd, user_session_t **out_session);

/**
 * @brief 根据文件描述符移除会话
 *
 * @param manager 会话管理器指针
 * @param fd 文件描述符
 * @return system_error_code_t 操作结果状态码
 */
system_error_code_t session_manager_remove_session(session_manager_t *manager, int fd);

/**
 * @brief 根据用户名获取会话
 *
 * @param manager 会话管理器指针
 * @param username 用户名
 * @param out_session 输出参数，用于接收会话指针的地址
 * @return system_error_code_t 操作结果状态码
 */
system_error_code_t session_manager_get_session_by_username(session_manager_t *manager, const char *username, user_session_t **out_session);

/**
 * @brief 注册用户到 username_map
 *
 * @param manager 会话管理器指针
 * @param username 用户名
 * @param session 会话指针
 * @return system_error_code_t 操作结果状态码
 */
system_error_code_t session_manager_register_username(session_manager_t *manager, const char *username, user_session_t *session);

#endif // __SESSION_MANAGER_H__